package ar.frba.utn.diseñosistemas.TP2;

import java.util.ArrayList;

import com.lanchita.AerolineaLanchita;

public class LanchitaAdapter extends Aerolinea 
{
	private AerolineaLanchita lanchita;
	
	public LanchitaAdapter()
	{
		this.porcentajeImpuesto = 15;
		this.lanchita = AerolineaLanchita.getInstance();
	}	
	
	@Override
	public void comprar(Asiento unAsiento, Usuario unUsuario) 
	{
		try
		{
			String codigo = getCodigo(unAsiento);
			
			this.lanchita.comprar(codigo);
			unAsiento.setEstado(EstadoAsiento.Comprado);
		}
		catch(RuntimeException ex)
		{
			throw new RuntimeException("El asiento no pudo ser comprado: " + ex.getMessage());
		}
	}

	@Override
	public ArrayList<Asiento> buscar(Busqueda unaBusqueda) 
	{	
		String[][] resultado = this.lanchita.asientosDisponibles(unaBusqueda.getOrigen(), unaBusqueda.getDestino(), unaBusqueda.getFecha(), null, null, null);
		
		ArrayList<Asiento> asientos = new ArrayList<Asiento>();
		for (String[] infoAsiento : resultado) 
		{
			Asiento unAsiento = this.parseAsiento(infoAsiento);
			this.aplicarImpuestoA(unAsiento);
			
			asientos.add(unAsiento);
		}
		
		return asientos;
	}
	
	public ArrayList<Asiento> buscarSinDestino(Busqueda unaBusqueda) 
	{	
		String[][] resultado = this.lanchita.asientosDisponibles(unaBusqueda.getOrigen(), null, unaBusqueda.getFecha(), null, unaBusqueda.getFecha(), null);
		
		ArrayList<Asiento> asientos = new ArrayList<Asiento>();
		for (String[] infoAsiento : resultado) 
		{
			Asiento unAsiento = this.parseAsiento(infoAsiento);
			this.aplicarImpuestoA(unAsiento);
			
			asientos.add(unAsiento);
		}
		
		return asientos;
	}

	public void reservar(Asiento unAsiento, Usuario unUsuario)
	{
		try
		{
			this.lanchita.reservar(getCodigo(unAsiento), unUsuario.getDni());
			unAsiento.setEstado(EstadoAsiento.Reservado);
		}
		catch(RuntimeException ex)
		{
			throw new RuntimeException("El asiento no pudo se reservado: " +  ex.getMessage());
		}
	}

	public Boolean estaReservado(Asiento unAsiento)
	{
		return unAsiento.getEstado() == EstadoAsiento.Reservado;
	}
	
	public String getNombre()
	{
		return "Lanchita";
	}
	
	private Asiento parseAsiento(String[] info)
	{
		Float precio = Float.parseFloat(info[1]);
		Clase clase = this.parseClase(info[2]);
		Ubicacion ubicacion = this.parseUbicacion(info[3]);
		EstadoAsiento estado = this.parseEstado(info[4]);
		
		String[] codigos = info[0].split("-");
		
		return new Asiento(codigos[0], codigos[1], precio, clase, ubicacion, estado,info[10], info[6], info[11], info[7], this, info[8], info[9]);
	}

	private EstadoAsiento parseEstado(String estado) {
		
		if (estado.equalsIgnoreCase("D"))
			return EstadoAsiento.Disponible;
		if (estado.equalsIgnoreCase("R"))
			return EstadoAsiento.Reservado;
		if (estado.equalsIgnoreCase("C"))
			return EstadoAsiento.Comprado;
		
		throw new RuntimeException("El servicio devolvio un estado invalido: " + estado);
	}

	private Ubicacion parseUbicacion(String ubicacion) {
		
		if (ubicacion.equalsIgnoreCase("C"))
			return Ubicacion.Centro;
		if (ubicacion.equalsIgnoreCase("P"))
			return Ubicacion.Pasillo;
		if (ubicacion.equalsIgnoreCase("V"))
			return Ubicacion.Ventanilla;
		
		throw new RuntimeException("El servicio devolvio una ubicacion invalida: " + ubicacion);
	}

	private Clase parseClase(String clase) {
		
		if (clase.equalsIgnoreCase("T"))
			return Clase.Turista;
		if (clase.equalsIgnoreCase("E"))
			return Clase.Ejecutivo;
		if (clase.equalsIgnoreCase("P"))
			return Clase.Primera;
		
		throw new RuntimeException("El servicio devolvio una clase invalida: " + clase);
	}

	private String getCodigo(Asiento unAsiento)
	{
		return unAsiento.getCodigoVuelo() + "-" + unAsiento.getNumeroAsiento();
	}

	void cambiarEstadoAsientoADisponible(Asiento asiento) 
	{
		asiento.setEstado(EstadoAsiento.Disponible);
	}
}
